Ruby 드라이버¶
CUBRID Ruby 드라이버는 Ruby로 작성한 응용 프로그램에서 CUBRID 데이터베이스를 사용할 수 있게 하는 드라이버로, RubyGem 패키지 형태로 제공된다.
CUBRID Ruby 드라이버는 CCI API를 기반으로 작성되었으므로, CCI API 및 CCI에 적용되는 CCI_DEFAULT_AUTOCOMMIT 과 같은 설정 파라미터에 영향을 받는다.
별도로 Ruby 드라이버를 다운로드하거나 Ruby 드라이버에 대한 최신 정보를 확인하려면 http://www.cubrid.org/wiki_apis/entry/cubrid-ruby-driver에 접속한다.
Ruby 설치 및 설정¶
기본 환경
- Ruby 1.8.7 이상
- CUBRID gem
- ActiveRecord gem
Linux
gem 을 사용하여 CUBRID Connector를 설치할 수 있다. 다음과 같이 sudo 명령어에 -E 옵션을 사용하여 sudo 명령어가 CUBRID 데이터베이스 설치 경로 환경 변수를 변경하지 않도록 해야 한다.
sudo -E gem install cubrid
Windows
다음 명령어를 실행하여 최신 버전의 CUBRID Ruby 드라이버를 설치한다.
gem install cubrid
Note
Gem Installer가 설치되어 있지 않다면 http://www.cubrid.org/wiki_apis/entry/cubrid-ruby-driver-installation-instructions 를 참고한다.
Ruby 예제 프로그램¶
여기에서는 Ruby로 CUBRID 데이터베이스에 대한 작업을 수행하는 예제 프로그램을 작성한다. 예제로 다음과 같이 테이블을 생성한다.
CREATE TABLE countries(
id INTEGER AUTO_INCREMENT,
code CHARACTER VARYING(3) NOT NULL UNIQUE,
name CHARACTER VARYING(40) NOT NULL UNIQUE,
record_date DATETIME DEFAULT SYSDATETIME NOT NULL,
CONSTRAINT pk_countries_id PRIMARY KEY(id)
);
CREATE TABLE cities(
id INTEGER AUTO_INCREMENT NOT NULL UNIQUE,
name CHARACTER VARYING(40) NOT NULL,
country_id INTEGER NOT NULL,
record_date DATETIME DEFAULT SYSDATETIME NOT NULL,
FOREIGN KEY (country_id) REFERENCES countries(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT pk_cities_id PRIMARY KEY(id)
);
라이브러리 로드
예제 프로그램으로 tutorial.rb 라는 파일을 생성하고 다음과 같은 기본 설정을 작성한다.
require 'rubygems'
require 'active_record'
require 'pp'
데이터베이스 연결
다음과 같이 파라미터를 정의하여 데이터베이스 연결을 생성한다.
ActiveRecord::Base.establish_connection(
:adapter => "cubrid",
:host => "localhost",
:database => "demodb" ,
:user => "dba"
)
데이터베이스에 객체 삽입
테이블을 조작하기 전에 테이블을 ActiveRecord의 클래스와 매핑해야 한다.
class Country < ActiveRecord::Base
end
class City < ActiveRecord::Base
end
Country.create(:code => 'ROU', :name => 'Romania')
Country.create(:code => 'HUN', :name => 'Hungary')
Country.create(:code => 'DEU', :name => 'Germany')
Country.create(:code => 'FRA', :name => 'France')
Country.create(:code => 'ITA', :name => 'Italy', :record_date => Time.now)
Country.create(:code => 'SPN', :name => 'Spain')
데이터베이스에서 레코드 조회
다음과 같이 데이터베이스에서 레코드를 조회한다.
romania = Country.find(1)
pp(romania)
romania = Country.where(:code => 'ROU')
pp(romania)
Country.find_each do |country|
pp(country)
end
데이터베이스 레코드 갱신
여기에서는 다음과 같이 Spain 의 code 를 'SPN' 에서 'ESP' 로 변경한다.
Country.transaction do
spain = Country.where(:code => 'SPN')[0]
spain.code = 'ESP'
spain.save
end
데이터베이스 레코드 삭제
데이터베이스의 레코드를 삭제하는 코드는 다음과 같다.
Country.transaction do
spain = Country.where(:code => 'ESP')[0]
spain.destroy
end
연관(association)을 이용한 작업
국가에 도시를 추가하는 방법 중 하나는 Country 를 조회하여 Country 의 code 를 새로운 City 객체에 할당하는 것이다.
romania = Country.where(:code => 'ROU')[0]
City.create(:country_id => romania.id, :name => 'Bucharest');
더 좋은 방법은 다음과 같이 ActiveRecord에 관계를 알리고 이를 Country 클래스에 선언하는 것이다.
class Country < ActiveRecord::Base
has_many :cities, :dependent => :destroy
end
class City < ActiveRecord::Base
end
위 코드에 따라 한 국가는 여러 개의 도시를 가질 수 있다. 이제 다음과 같이 간단하게 국가에 새 도시를 추가할 수 있다. 이 방법을 사용하면 도시에 접근할 때 참조되는 국가의 모든 도시들을 얻을 수 있으므로 유용하게 사용할 수 있다.
italy = Country.where(:code => 'ITA')[0]
italy.cities.create(:name => 'Milano');
italy.cities.create(:name => 'Napoli');
pp (romania.cities)
pp (italy.cities)
또한 다음과 같은 코드로 국가를 삭제하면 그 국가의 모든 도시가 삭제된다.
romania.destroy
ActiveRecord 는 일대일이나 다대다(many-to-many)와 같은 관계도 지원한다.
메타데이터 관리
ActiveRecord를 사용하면 코드를 수정하지 않아도 다른 데이터베이스를 사용할 수 있다.
데이터베이스 구조 정의
ActiveRecord::Schema.define 을 사용하여 새 테이블을 정의할 수 있다. 예를 들면 다음과 같이 일대다(one-to-many)로 대응되는 책에 대한 테이블(books)과 저자에 대한 테이블(authors)을 생성할 수 있다.
ActiveRecord::Schema.define do
create_table :books do |table|
table.column :title, :string, :null => false
table.column :price, :float, :null => false
table.column :author_id, :integer, :null => false
end
create_table :authors do |table|
table.column :name, :string, :null => false
table.column :address, :string
table.column :phone, :string
end
add_index :books, :author_id
end
CUBRID에서 지원하는 칼럼 타입은 :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :boolean, :bit, :smallint, :bigint, :char 이다. 현재 :binary 는 지원하지 않는다.
테이블 칼럼 관리
ActiveRecord::Migration 의 기능을 사용하여 테이블의 칼럼을 추가하거나 업데이트, 삭제할 수 있다.
ActiveRecord::Schema.define do
create_table :todos do |table|
table.column :title, :string
table.column :description, :string
end
change_column :todos, :description, :string, :null => false
add_column :todos, :created, :datetime, :default => Time.now
rename_column :todos, :created, :record_date
remove_column :todos, :record_date
end
데이터베이스 스키마 덤프
ActiveRecord::SchemaDumper.dump 를 사용하여 현재 사용 중인 스키마의 정보를 덤프할 수 있다. 덤프된 스키마 정보는 플랫폼과 상관없이 사용할 수 있는 형식으로 저장되며 Ruby ActiveRecord에서도 사용할 수 있다.
단, :bigint, :bit 등과 같이 특정 데이터베이스에서 사용되는 커스텀 칼럼 타입을 사용한다면 제대로 동작하지 않을 수 있다.
서버 용량 정보 획득
현재 연결에서 다음과 같이 데이터베이스 정보를 획득할 수 있다.
puts "Maximum column length : " + ActiveRecord::Base.connection.column_name_length.to_s
puts "SQL statement maximum length : " + ActiveRecord::Base.connection.sql_query_length.to_s
puts "Quoting : '''test''' : " + ActiveRecord::Base.connection.quote("'''test'''")
데이터베이스 생성
CUBRID에서는 데이터베이스 생성을 cubrid create 유틸리티 명령어로만 처리하기 때문에, 프로그램 내에서는 데이터베이스를 생성할 수 없다.
ActiveRecord::Schema.define do
create_database('not_supported')
end